package edu.unice.simul.modele;

import java.util.List;

import javax.swing.event.EventListenerList;

import edu.unice.simul.controleur.SimulationControleur;
import edu.unice.simul.listeners.ConfigListener;
import edu.unice.simul.modele.contenus.immobiles.Mur;
import edu.unice.simul.modele.contenus.immobiles.Sortie;
import edu.unice.simul.modele.contenus.mobiles.Humain;
import edu.unice.simul.modele.enums.Age;
import edu.unice.simul.modele.enums.Sociabilite;
import edu.unice.simul.util.Dim;
import edu.unice.simul.vue.initialisation.modes_dessin.BlockType;

/**
 * Modèle décrivant le paramétrage des humains
 * 
 * @author Romain Ciaccafava
 * 
 */
public class ConfigModel {
	private EventListenerList listeners = new EventListenerList();
	private final Piece piece;

	public ConfigModel(BlockType[][] world) {
		if (world.length < 1)
			throw new IllegalArgumentException(
					"La taille de la pièce est trop faible.");

		Dim dimmensionsDeLaPiece = new Dim(world.length, world[0].length);
		piece = new Piece(dimmensionsDeLaPiece);

		for (int i = 0; i < world.length; i++)
			for (int j = 0; j < world[i].length; j++) {
				switch (world[i][j]) {
				case HUMAIN:
					piece.ajouterContenu(new Humain(new Dim(i, j), piece));
					break;
				case SORTIE:
					piece.ajouterContenu(new Sortie(new Dim(i, j)));
					break;
				case MUR:
					piece.ajouterContenu(new Mur(new Dim(i, j)));
					break;
				default:
				}
			}
	}

	public List<Humain> getHumains() {
		return piece.getHumains();
	}

	/**
	 * Démarre la simulation
	 */
	public void start() {
		new SimulationControleur(piece);
	}

	/**
	 * Ajoute un écouteur au paramétrage de la simulation
	 */
	public void addConfigListener(ConfigListener listener) {
		listeners.add(ConfigListener.class, listener);
	}

	/**
	 * Retire un écouteur au paramétrage de la simulation
	 */
	public void removeConfigListener(ConfigListener listener) {
		listeners.remove(ConfigListener.class, listener);
	}

	/**
	 * Notifie aux vue que le paramétrage de la simulation a changé
	 */
	public void fireConfigChanged() {
		ConfigListener[] listenerList = (ConfigListener[]) listeners
				.getListeners(ConfigListener.class);

		for (ConfigListener listener : listenerList) {
			listener.refreshHumains(getHumains());
		}
	}

	/**
	 * Génère aléatoirement les paramétrages des humains. À noter : le pourcentage
	 * de vie est compris entre 50 et 100.
	 */
	public void generate() {
		for (Humain h : piece.getHumains()) {
			h.setPrcVie(Math.floor(Math.random() * 51 + 50));
			h.setAge(Age.values()[(int) Math.floor(Math.random() * 3)]);
			h.setSociabilite(Sociabilite.values()[(int) Math.floor(Math.random() * 3)]);
		}

		fireConfigChanged();
	}
}
